import java.sql.*;

public class DBUtil { // Math System
    // 数据库的主机名，端口号，数据库名，关闭SSL，采用Unicode字符集，并以Utf8为编码
    private static final String url = "jdbc:mysql:///student_db?useSSL=false&useUnicode=true&characterEncoding=utf8";// localhost:3306是默认的主机和端口号，可以省略掉
    private static final String user = "root"; // 用户名
    private static final String password = "root";// 密码

    // 注册驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动注册异常");
            e.printStackTrace();// 开发调试阶段，为了排查具体错误，要把详细的异常信息打印
        }
    }

    // 获取连接对象  // static方法是静态方法，是直接通过类名访问的
    public static Connection getConn() {
        Connection conn = null;// alt+回车
        try {
            conn = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            System.out.println("获取连接对象失败");
            e.printStackTrace();
        }
        return conn;
    }

    // 一个通用查询方法,接收SQL语句，返回结果集
    public static ResultSet query(String sql, String... keys) {
        // String sql = "update student set id=? , name =? , sex =? where id=?";
        // 形参前加... 就表示其是可变参数，就是数组
        // 获取连接对象
        ResultSet rs = null;
        try {
            Connection conn = getConn();
            // 建立预编译SQL的对象
            PreparedStatement pst = conn.prepareStatement(sql);// 将？号转成变量
            // 给每个变量赋值
            // 遍历可变参数
            for (int i = 0; i < keys.length; i++) {
                pst.setString((i + 1), keys[i]);
            }
            // 执行SQL
            rs = pst.executeQuery();
        } catch (SQLException e) {
            System.out.println("执行查询异常");
            e.printStackTrace();
        }
        return rs;
    }

    // ，一个通用更新的方法（删除，添加，修改），
    public static int update(String sql, String... keys) {
        // String sql = "update student set id=? , name =? , sex =? where id=?";
        // 形参前加... 就表示其是可变参数，就是数组
        // 获取连接对象
        int num = 0;
        try {
            Connection conn = getConn();
            // 建立预编译SQL的对象
            PreparedStatement pst = conn.prepareStatement(sql);// 将？号转成变量
            // 给每个变量赋值
            // 遍历可变参数
            for (int i = 0; i < keys.length; i++) {
                pst.setString((i + 1), keys[i]);
            }
            // 执行SQL
            num = pst.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return num;

        //
        //
        // 一个通用的关闭资源的方法

    }
}
